<?php
/**
 * PrynLib
 * @copyright 2007-2009 Prynel
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @category libPrynel
 * @package Image
 * @version $Revision: 80 $
 */

/**
 * Créer le reflet d'une image à la mode 2.0
 * @category libPrynel
 * @package Image
 * @version 1.1.0 
 * @author Olivier ROGER <roger.olivier@gmail.com>
 * @copyright  2007-2009 Prynel
 *       
 * <code>
 * $image = new Image_Reflection('cheminimage.jpg');
 * $image->reflect(40,50,90);
 * $image->save(imagereflet.jpg);
 * </code>
 */

class Image_Reflection extends Image_Image
{
	/**
	 * Image de travail
	 *
	 * @var ressource
	 * @access private
	 */
	private $tempImage;
	
	/**
	 * Couleur
	 *
	 * @var int
	 * @access private
	 */
	private $colorToUse;
	
	/**
	 * Constructeur
	 *
	 * @param string $img Chemin vers l'image à manipuler
	 */
	public function __construct($img)
	{
		parent::__construct($img);
	}
	
	/**
	 * Créer le reflet de l'image
	 *
	 * @param int $percent Pourcentage de l'image de base utilisé
	 * @param int $transparence Valeur de transparence 0= opaque 100 = transparent
	 */
	public function reflect($percent,$transparence)
	{
		//Calcul de la hauteur de la réflexion en fct de la taille de l'image.
		$partieReflechie   = $hauteurReflection = intval($this->height * ($percent/100));
		$nouvelleHauteur   = $this->height + $hauteurReflection;
		//Création image de travail blanche avec transparence activé
		$this->tempImage = imagecreatetruecolor($this->width,$nouvelleHauteur);
		imagealphablending($this->tempImage,TRUE);
		$this->colorToUse = $this->setAlphaColor(255,255,255,0);
		imagefilledrectangle($this->tempImage,0,0,$this->width,$nouvelleHauteur,$this->colorToUse);
		
		//Copie de la partie de l'image de base à réfléchir dans l image de travail
		imagecopyresampled($this->tempImage,$this->source,
							0,0,
							0,$partieReflechie,
							$this->width,$hauteurReflection,
							$this->width,($this->height-$partieReflechie));
		//Rotation de l'image de travail
		$this->flip();
		
		//On recopie l'image de base sur la rotation.
		imagecopy($this->tempImage,$this->source,0,0,0,0,$this->width,$this->height);
		
		// On applique, pour finir, la transparence si besoin.
		//Transparence dégradé de : % donné => blanc complet

		for($i=0;$i<$hauteurReflection;$i++)
		{
			$this->colorToUse = $this->setAlphaColor(255,255,255,(127*(1-($i/$hauteurReflection))*$transparence/100));
			imagefilledrectangle($this->tempImage,
									0,$this->height+$i,
									$this->width,$this->height+$i,$this->colorToUse);
		}
		$this->source = $this->tempImage;
	}
	
	/**
	 * Attribut une couleur avec valeur de transparence
	 *
	 * @param int $r composante rouge
	 * @param int $g composante verte
	 * @param int $b composante bleue
	 * @param int $alpha composante alpha (transparence)
	 * @return int Identifiant couleur
	 */
	private function setAlphaColor($r,$g,$b,$alpha)
	{
		return imagecolorallocatealpha($this->tempImage,$r,$g,$b,$alpha);
	}
	
	/**
	 * Retourne l'image verticalement
	 * @access private
	 */
	private function flip()
	{
		$w = imagesx($this->tempImage);
		$h = imagesy($this->tempImage);
		for($x=0;$x<$w;$x++)
		{
			for($y=0;$y<$h;$y++)
			{
				imagecopy($this->tempImage,$this->tempImage,$x,($h-$y-1),$x,$y,1,1);
			}
		}
	}
	
	public function __destruct()
	{
		if(is_resource($this->tempImage))
			imagedestroy($this->tempImage);
	}
}
 ?>